5.1.- Esquema de la cabecera de un fichero del Impulse
0 1 2 3 4 5 6 7 8 9 A B C D E F
+---------------------------------------------------------------+
0000: ¦'I'¦'M'¦'P'¦'M'¦ Nombre de la canción,
max 256, incluyendo NULL¦
+---------------------------------------------------------------¦
0010: ¦.......................................................¦
x ¦ x ¦
+-------------------------------------------------------+-------¦
0020: ¦OrdNum ¦InsNum ¦SmpNum ¦PatNum ¦
Cwt/v ¦ Cmwt ¦ Flags ¦Special¦
+-------+-------+-------+-------+---------------+-------+-------¦
0030: ¦GV ¦MV ¦IS ¦IT ¦Sep¦(0)¦MsgLgth¦Message
Offset ¦ x ¦ x ¦ x ¦ x ¦
+---------------------------------------------------------------¦
0040: ¦ Chnl Pan (64
bytes)...........................................¦
+---------------------------------------------------------------¦
+---------------------------------------------------------------¦
0080: ¦ Chnl Vol (64
bytes)...........................................¦
+---------------------------------------------------------------¦
+---------------------------------------------------------------¦
00C0: ¦ Orders, Length = OrdNum ¦
+---------------------------------------------------------------¦
xxxx: ¦ 'Long' Desplaz. de instrum., Longitud = InsNum*4 (1) ¦
+---------------------------------------------------------------¦
xxxx: ¦ 'Long' Desplaz. de cabec. de samp., Long. = SmpNum*4 (2)
¦
+---------------------------------------------------------------¦
xxxx: ¦ 'Long' Desplaz. de patrones, Long. = PatNum*4 (3) ¦
+---------------------------------------------------------------+
(1) Offset = 00C0h+OrdNum
(2) Offset = 00C0h+OrdNum+InsNum*4
(3) Offset = 00C0h+OrdNum+InsNum*4+SmpNum*4
Ten en cuenta que si el desplazamiento (long) a un patrón es 0, el patrón es asumido como un patrón de 64 filas vacío.
Cwt: Creado con Impulse Tracker: Impulse Tracker y.xx = 0yxxh
Cmwt: Compatible con el tracker con versión mayor que el valor (es decir, versión del formato)
OrdNum: Número de órdenes en la canción.
InsNum: Número de instrumentos en la canción.
SmpNum: Número de samples en la canción.
PatNum: Número de patrones en la canción.
Flags:
Diferencias:
Special: Bit 0: On = Añadido mensaje de la canción.
Mensaje de la canción:
Almacenado en el campo dado por "Message Offset".
Longitud = MsgLgth.
NuevaLinea = 0Dh (13 dec)
FindelMensaje = 0
Nota: Las v1.04+ del IT deben tener mensajes añadidos de más de 8000 bytes.
Bits 1-15: No definido.
GV: Volumen global. (0® 128) Todos los volúmenes están ajustados a este.
MV: Volumen de mezcla (0® 128) Durante la mezcla, este valor controla la magnitud de la onda que está siendo mezclada.
IS: Velocidad inicial de la canción.
IT: Tempo inicial de la canción.
Sep: Separación del panning entre canales (0® 128, 128 es la max.)
Chnl Vol: Volumen de cada canal. El rango va de 0 a 64.
Chnl Pan: Cada
byte contiene un valor de panning para cada canal. Va desde 0 (izquierda
del todo) a 64 (derecha del todo).
32 = En el centro, 100 = Sonido surround.
+128 = Canal desactivado (las notas no serán
reproducidas, pero los efectos en los canales desactivados siguen siendo
procesados).
Orders: Este es el orden en el cual los patrones son reproducidos. Los valores válidos van desde 0 a 199.
255 = "---", Fin de canción.
254 = "+++", Pasar al siguiente orden.
5.2.- Formato de instrumento del Impulse antiguo (cmwt < 200h)
0 1 2 3 4 5 6 7 8 9 A B C D E F
+---------------------------------------------------------------+
0000: ¦'I'¦'M'¦'P'¦'I'¦ Nombre de fichero
DOS (12345678.123) ¦
+---+---+---+---+-----------------------------------------------¦
0010: ¦00h¦Flg¦VLS¦VLE¦SLS¦SLE¦ x ¦
x ¦FadeOut¦NNA¦DNC¦TrkVers¦NoS¦ x ¦
+---------------------------------------------------------------¦
0020: ¦ Nombre instrumento, max 26 bytes, incluyendo
NUL..............¦
+---------------------------------------------------------------¦
0030: ¦.......................................¦ x ¦ x ¦
x ¦ x ¦ x ¦ x ¦
+---------------------------------------------------------------¦
0040: ¦ Tabla de Notas/Samples, Longitud = 240
bytes..................¦
+---------------------------------------------------------------¦
+---------------------------------------------------------------¦
0130: ¦ Envolvente de volumen (200
bytes).............................¦
+---------------------------------------------------------------¦
+-------------------------------¦
01F8: ¦ Nodos (25x2 bytes)............¦
+-------------------------------+
La longitud total de una cabecera de instrumento antiguo es 554 bytes.
Flg:
VLS: Comienzo del loop de volumen (número de nodo)
VLE: Fin del loop de volumen (número de nodo)
SLS: Comienzo del loop de sustain (número de nodo)
SLE: Fin del loop de sustain (número de nodo)
FadeOut: Va de 0 a 64, pero el "Count" del fadeout es 512.
El Fade se aplica cuando:
DNC: Check de notas duplicadas (0 = Off, 1 = On)
NNA: Acción de Nueva Nota:
TrkVers: Versión del Tracker utilizado para grabar el instrumento. Esto sólo es utilizado en los ficheros de instrumento.
NoS: Número de samples asociados al instrumento. Sólo es usado en los ficheros de instrumento.
Tabla de Notas-Samples: Cada nota del instrumento es convertida primero a un número de sample y una nota (de C-0 a B-9). Estos son almacenados como pares nota/sample (la nota primero, con un rango de 0 a 119 para C-0 y B-9 respectivamente, y después el sample con un rango de 1 a 99, 0=No hay sample).
Envolvente de volumen: Valores de 0 a 64, indicando 0FFh el final del tratamiento (a partir del cual se aplica el fade).
Datos de nodo: Señal THEN magnitud
5.3.- Formato de instrumento del Impulse
0 1 2 3 4 5 6 7 8 9 A B C D E F
+---------------------------------------------------------------+
0000: ¦'I'¦'M'¦'P'¦'I'¦ Nombre de fichero
DOS (12345678.123) ¦
+---+---+---+---+-----------------------------------------------¦
0010: ¦00h¦NNA¦DCT¦DCA¦FadeOut¦PPS¦PPC¦GbV¦DfP¦RV
¦RP ¦TrkVers¦NoS¦ x ¦
+---------------------------------------------------------------¦
0020: ¦ Nombre instrumento, max 26 bytes, incluyendo
NUL..............¦
+---------------------------------------------------------------¦
0030: ¦.......................................¦ x ¦ x ¦
x ¦ x ¦ x ¦ x ¦
+---------------------------------------------------------------¦
0040: ¦ Tabla de Notas/Samples, Longitud = 240
bytes..................¦
+---------------------------------------------------------------¦
+---------------------------------------------------------------¦
0130: ¦
Envolventes...................................................¦
+---------------------------------------------------------------¦
NNA: Acción de Nueva Nota
DCT: Tipo de Check de Duplicados
DNA: Acción de Check de Duplicados
FadeOut: Va desde 0 a 128, pero el "Count" de fadeout es 1024. Mirar la última sección de este apartado 5 para ver cómo funciona esto.
El fade se aplica cuando:
PPS: Separación del Pitch-Pan , rango -32 ® +32
PPC: Centro del Pitch-Pan: De C-0 a B-9 representado como 0® 119 ambos inclusive
GbV: Volumen Global, 0® 128
DfP: Panning por defecto, 0® 64, >128 => No se usa.
RV: Variación de volumen aleatoria (porcentaje)
RP: Variación de panning aleatoria (cambio de panning - no implementado todavía)
TrkVers: Versión del tracker utilizado para grabar el instrumento. Utilizado sólo en los ficheros de instrumento.
NoS: Número de samples asociados al instrumento. Utilizado sólo en los ficheros de instrumento.
Tabla de Notas/Samples:
Cada nota del instrumento es convertida primero a un número de
sample y una nota (de C-0 a B-9). Estos son almacenados como pares
nota/sample (la nota primero, con un rango de 0 a 119 para C-0 y B-9
respectivamente, y después el sample con un rango de 1 a 99, 0=No
hay sample).
Envolventes: 3 estructuras, primera para el volumen (130h), segunda para el panning (182h) y tercera para el tono (1D4h).
Cada una está estructurada como sigue:
0 1 2 3 4 5 6.......
+---------------------------------------------------------------+
xxxx: ¦Flg¦Num¦LpB¦LpE¦SLB¦SLE¦
Puntos de nodo (25), 75 bytes.....¦ x ¦
+---+---+---+---+---+---+-----------------------------------+---¦
Flg:
Num: Número de nodos
LpB: Comienzo del Loop
SLB: Comienzo del Sustain loop
LpE: Fin del Loop
SLE: Fin del Sustain loop
Punto del nodo: 1 byte para el valor de y (0® 64 para el volumen, -32® +32 para el panning o el pitch) 1 palabra (2 bytes) para el número de ticks (0® 999)
La longitud total de un instrumento es 547 bytes, pero son escritos 554 bytes, solo para simplificar la carga del formato antiguo (por lo tanto se "malgastan" 7 bytes por instrumento).
5.5.- Formato de Sample del Impulse
0 1 2 3 4 5 6 7 8 9 A B C D E F
+---------------------------------------------------------------+
0000: ¦'I'¦'M'¦'P'¦'S'¦ Nombre de fichero
DOS (12345678.123) ¦
+---+---+---+---+-----------------------------------------------¦
0010: ¦00h¦GvL¦Flg¦Vol¦ Nombre del Sample ,
max 26 bytes, incluye NUL.¦
+---------------------------------------------------------------¦
0020: ¦.......................................................¦Convert¦
+---------------------------------------------------------------¦
0030: ¦ Length ¦ Loop Begin ¦ Loop End ¦ C5Speed ¦
+---------------+---------------+---------------+---------------¦
0040: ¦ SusLoop Begin ¦ SusLoop End ¦ SamplePointer ¦ViS¦ViD¦ViR¦ViT¦
+---------------------------------------------------------------+
El fichero caché tiene los siguientes trozos de información añadidos:
0 1 2 3 4 5 6 7 8 9 A B C D E F
+---------------------------------------------------------------+
0050: ¦ Tamaño Fichero¦ Fecha ¦ Hora ¦Fmt¦...........................¦
+---------------------------------------------------------------+
Fmt: 0 = no checkeado 1 = directorio, 2 = sample it, 3 = sample st
GvL: Volumen Global para el instrumento, va desde 0 a 64
Flg:
Vol: Volumen por defecto para el instrumento
Length: Longitud del sample en número de samples, NO en número de bytes (un sample es la muestra puntual de sonido).
LoopBeg: Comienzo del loop (En número de samples, no bytes).
Loop End: Número de sample de DESPUES del final del loop.
C5Speed: Número de bytes por segundo para C-5 (va desde 0 a 9999999).
SusLBeg: Comienzo del loop sustain.
SusLEnd: Número de sample después del final del loop sustain.
SmpPoint: Desplazamiento 'Long' del sample en el fichero.
ViS: Velocidad del Vibrato, va desde 0 a 64.
ViD: Profundidad del Vibrato, va desde 0 a 64.
ViT: Tipo de forma de onda del Vibrato.
ViR: Proporción de Vibrato, proporción a la que está aplicado el vibrato (0® 64)
La profundidad del vibrato en cualquier punto se implementa de la siguiente manera:
En cada ciclo de proceso, ocurre lo siguiente:
1) Mov AX,
[NombreDeVariableRelacionadaConElVibrato]
2) Add AL, Proporción
3) AdC AH, 0
4) AH contiene la profundidad del
vibrato como un deslizamiento lineal leve.
5) Mov
[NombreDeVariableRelacionadaConElVibrato], AX
; Para el siguiente
; ciclo.
Para aquellos que no entienden de ensamblador, la profundidad es básicamente la suma de las proporciones dividida por 256.
El vibrato de Sample utiliza una tabla de 256 bytes de largo.
Convert : Todos los bits aparte del 0 son usados internamente para cargar formatos alternativos.
Bit 0:
Off: Samples sin signo } IT 2.02 y
superiores utilizan samples con signo.
On: Samples con signo } IT 2.01 e
inferiores utilizan samples sin signo.
Bit 1:
Off: Orden lo-hi de Intel para samples
de 16-bit
On: Orden hi-lo de Motorola para
samples de 16-bit
Bit 2:
Off: Los samples son almacenados como
valores PCM
On: Los samples son almacenados como
valores Delta
Bit 3:
On: Los samples son almacenados como
valores byte delta (para el cargador PTM)
Bit 4:
On: Los samples son almacenados como
valores TX-Wave 12-bit
5.6.- Formato de patrones del Impulse
0 1 2 3 4 5 6 7 8 9 A B C D E F
+---------------------------------------------------------------+
0000: ¦Long. ¦ Filas ¦ x ¦ x ¦ x ¦ x ¦
Datos empaquetados......... ¦
+-------+-------+---+---+---+---+-------------------------------¦
Long.: Longitud del patrón empaquetado, sin incluir la cabecera de 8 bytes. Nótese que el patrón + los 8 bytes de la cabecera tiene que ser SIEMPRE menor que 64k
Filas: Número de filas en este patrón (Va desde 32 a 200)
Los patrones son desempaquetados con el siguiente pseudocódigo... (esto puede parecer horrible, pero en la práctica, es tan conveniente como el formato de patrones S3M para la reproducción (pero no para ponerlo en pantalla))
GetNextChannelMarker:
Leer byte en variablecanal.
if(variablecanal = 0) then final de fila
Canal = (variablecanal-1) & 63 ; Canal está basado en el
0.
If (variablecanal & 128) then
leer byte en variablemask
else
variablemask = variablemaskanterior para el canal actual
if(variablemask & 1), then
leer nota. (byte)
// Las notas van de 0 a 119 (C-0 -> B-9)
// 255 = Apagado de nota, 254 = Corte de nota
// Otros = fade de nota
if(variablemask & 2), then
leer instrumento (byte)
// El instrumento va desde 1 a 99
if(variablemask & 4), then leer
volumen/panning (byte)
// El volumen va desde 0 a 64
// El panning va desde 0 a 64, mapeado en 128®
192
// Prepárate para lo siguiente también:
// 65® 74 = Bajar volumen levemente
// 75® 84 = Subir volumen levemente
// 85® 94 = Bajar volumen
// 95® 104 = Subir volumen
// 105® 114 = Deslizamiento del
panning a izquierda
// 115® 124 = Deslizamiento del
panning a derecha
// 193® 255 probablemente también
se le asignará algún significado.
El efecto 65 es equivalente a DF0, 66 es equivalente a DF1® 74 = DF9
Similarmente para 75-84 (DxF), 85-94 (D0x), 95-104 (Dx0),
Deslizamiento del panning a la izquierda (Px0), Deslizamiento del panning a la derecha (P0x).
Estos efectos comparten memoria, por lo que en estas secuencias:
(DF1) = 66 ® El
volumen baja levemente 1
(DF0) = 65 ® El volumen baja
levemente 1 otra vez
(D0F) = 75 ® El volumen sube
levemente 1
(P00) = 105 ® Deslizamiento de 1 del
panning a la izquierda
(P00) = 115 ® Deslizamiento de 1 del
panning a la derecha
(DF2) = 66 ® El volumen baja
levemente 2
(DF0) = 65 ® El volumen baja
levemente 2 otra vez
(D0F) = 75 ® El volumen sube 2
(P00) = 105 ® Deslizamiento de 2 del
panning a izquierda
(P00) = 115 ® Deslizamiento de 2 del
panning a derecha
if(variablemask & 8), then
leer comando (byte) and valorcomando
// Van desde 0 a 31 (0=sin efecto, 1=A, 2=B, 3=C, etc.)
if(variablemask & 16), then
nota = ultimanota para el canal
if(variablemask & 32), then
instrumento = ultimoinstrumento para el canal
if(variablemask & 64), then
volumen/pan = ultimovolumen/pan para el canal
if(variablemask & 128), then {
comando = ultimocomando para el canal y
valorcomando = ultimovalorcomando para el canal
}
Goto GetNextChannelMarker
Abreviaciones:
FV = Volumen Final (Va desde 0 a 128). En versiones superiores a la 1.04, los dispositivos de mezcla al exterior son reducidos a un rango de 0 a 64 debido a falta de memoria.
Vol = Volumen al que la nota va a ser reproducida. (Va desde 0 a 64)
SV = Volumen del sample (Va desde 0 a 64)
IV = Volumen del instrumento (Va desde 0 a 128)
CV = Volumen del canal (Va desde 0 a 64)
GV = Volumen global (Va desde 0 a 128)
VEV = Valor del Tratamiento de Volumen (Va desde 0 a 64)
En modo sample, se hace el siguiente cálculo:
FV = Vol * SV * CV * GV / 262144 ; Nótese
que 262144 = 2^18
; Por lo que se puede hacer
; un desplazamiento de bits.
En el modo instrumento se utiliza el siguiente
procedimiento:
1) Actualizar el valor de la envolvente
de volumen. Mirar si hay loop o se llega al final de la envolvente.
2) Si se llega al final del tratamiento
(es decir, posicion >= 200 o VEV = 0FFh), entonces activar el fade de
nota.
3) Si el fade de nota está
activado, entonces ComponenteFadeNota (NFC) = NFC - FadeOut
; NFC debe ser inicializado a 1024 cuando una nota es reproducida.
4) FV = Vol * SV * IV * CV * GV * VEV *
NFC / 2^40 ; Nótese que 8589934592 = 2^33
Los slides lineales funcionan así:
Frecuencia final = Frecuencia Original *
2^(ValorDeSlide/768)
(Yo utilicé una tabla para mirar los multiplicadores aquí)
Para el comando Exx: ValorDeSlide = -4*ValorDeEfecto
Para el comando Eex: ValorDeSlide = -ValorDeEfecto
Para el comando Fxx: ValorDeSlide = 4*ValorDeEfecto
Para el comando Fex: ValorDeSlide = ValorDeEfecto
Nótese que el vibrato de sample siempre utiliza slides lineales.
Notas acerca de los efectos (comparándolo con otros formatos de módulo)
C Ahora está en HEXADECIMAL. (En ST3 estaba en decimal)
E/F/G/H/U Debes chequear si la canción utiliza slides Amiga/Lineales.
H/U El vibrato en el IT es dos veces más preciso que en otro tracker y es actualizado cada "Tick". Si "Old Effects" está activado, entonces el vibrato es reproducido de la manera normal (todas los "ticks" que no sean fila y con profundidad normal).
E/F/G Estos comandos comparten memoria.
Oxx Los desplazamientos a los samples son para el 'xx00th' SAMPLE. (es decir, para samples de 16 bits, el desplazamiento es xx00h*2)
Si el valor xx de O se pasa del final del sample será ignorado, a no ser que "Old Effects" esté activado, en ese caso el Oxx reproducirá desde el final del sample.
Yxy Utiliza una tabla 4 veces más grande (por lo que es 4 veces más lenta) que el vibrato o el tremolo. Si la forma de onda está puesta a aleatoria, entonces la parte de 'velocidad' del comando es interpretada como un retraso.
Si lees este documento y hay algunos puntos en los que tengas problemas (y tienes que resolverlos), entonces házmelo saber (porqué alguién más tendrá las mismas preguntas) y quisiera hacer este documento lo más fácil de comprender posible.
Para el Panning....
Este es el procedimiento que se usa:
PanDeLaNota = PanDelCanal
if PanDelInstrumento=On then
PanDeLaNota = PanDelInstrumento
PanDeLaNota = PanDeLaNota+(NotaDelInstrumento-CentroPitchPan)*
SeparacionPitchPan/8
Envolvente de Tono (Pitch)
Cada valor en la envolvente es igual a la mitad de un semitono. Esto es interpolado 64 veces para un deslizamiento leve del tono. Valores positivos indican una variación del tono mayor que x semitonos, valores negativos indican una variación del tono menor.
Información general
El reproductor del Impulse Tracker 'sitúa' los canales cuando son reproducidos. En el modo sample, la situación es simple:
Canal Virtual = Canal 'Hospedador'
En el modo Instrumento, es usado el siguiente procedimiento:
Mirar si el canal está reproduciendo ---Sí--->
poner el flag 'background' on.
| 'Lanzar' los NNA.
| Si NNA=cut,
No entonces usa este canal
| virtual.
| |
|<------------------ sino -----------------/
|
v
Busca y encuentra el primer canal virtual no activo.
|
Canal no activo encontrado? ----Sí----> Utilízalo
para la reproducción.
|
No
|
v
Busca y encuentra el canal de volumen más bajo que esté
sonando de fondo (es decir, que no esté controlado directamente)
|
Encontrado canal de fondo? ----Sí----> Utilízalo
para la reproducción.
|
No
|
v
Retorno de error - la nota no está situada en ningún
canal, y por tanto no está siendo reproducida.
Este es un proceso simple... es simplemente una de esas cosas engorrosas que hay que escribir...
Datos de Seno Leve
DB 0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 16, 17,
19, 20, 22, 23
DB 24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44
DB 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59
DB 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 64
DB 64, 64, 64, 64, 64, 64, 63, 63, 63, 62, 62, 62, 61, 61, 60, 60
DB 59, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46
DB 45, 44, 43, 42, 41, 39, 38, 37, 36, 34, 33, 32, 30, 29, 27, 26
DB 24, 23, 22, 20, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 3, 2
DB 0, -2, -3, -5, -6, -8, -9,-11,-12,-14,-16,-17,-19,-20,-22,-23
DB -24,-26,-27,-29,-30,-32,-33,-34,-36,-37,-38,-39,-41,-42,-43,-44
DB -45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-56,-57,-58,-59
DB -59,-60,-60,-61,-61,-62,-62,-62,-63,-63,-63,-64,-64,-64,-64,-64
DB -64,-64,-64,-64,-64,-64,-63,-63,-63,-62,-62,-62,-61,-61,-60,-60
DB -59,-59,-58,-57,-56,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46
DB -45,-44,-43,-42,-41,-39,-38,-37,-36,-34,-33,-32,-30,-29,-27,-26
DB -24,-23,-22,-20,-19,-17,-16,-14,-12,-11, -9, -8, -6, -5, -3, -2
Datos De Onda Triangular Leve
DB 64, 63, 63, 62, 62, 61, 61, 60, 60, 59, 59,
58, 58, 57, 57, 56
DB 56, 55, 55, 54, 54, 53, 53, 52, 52, 51, 51, 50, 50, 49, 49, 48
DB 48, 47, 47, 46, 46, 45, 45, 44, 44, 43, 43, 42, 42, 41, 41, 40
DB 40, 39, 39, 38, 38, 37, 37, 36, 36, 35, 35, 34, 34, 33, 33, 32
DB 32, 31, 31, 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24
DB 24, 23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16
DB 16, 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8
DB 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0
DB 0, -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7, -8
DB -8, -9, -9,-10,-10,-11,-11,-12,-12,-13,-13,-14,-14,-15,-15,-16
DB -16,-17,-17,-18,-18,-19,-19,-20,-20,-21,-21,-22,-22,-23,-23,-24
DB -24,-25,-25,-26,-26,-27,-27,-28,-28,-29,-29,-30,-30,-31,-31,-32
DB -32,-33,-33,-34,-34,-35,-35,-36,-36,-37,-37,-38,-38,-39,-39,-40
DB -40,-41,-41,-42,-42,-43,-43,-44,-44,-45,-45,-46,-46,-47,-47,-48
DB -48,-49,-49,-50,-50,-51,-51,-52,-52,-53,-53,-54,-54,-55,-55,-56
DB -56,-57,-57,-58,-58,-59,-59,-60,-60,-61,-61,-62,-62,-63,-63,-64
Onda Cuadrada Leve
DB 128 Dup (64), 128 Dup (0)
Patrón Vacío
DW 64, 64, 0, 0
DB 64 Dup (0)
Tabla De Tono Los Valores son de 16.16 bit
DW 2048, 0, 2170, 0, 2299, 0, 2435, 0, 2580,
0, 2734, 0 ; C-0
DW 2896, 0, 3069, 0, 3251, 0, 3444, 0, 3649, 0, 3866, 0 ;>B-0
DW 4096, 0, 4340, 0, 4598, 0, 4871, 0, 5161, 0, 5468, 0 ; C-1
DW 5793, 0, 6137, 0, 6502, 0, 6889, 0, 7298, 0, 7732, 0 ;>B-1
DW 8192, 0, 8679, 0, 9195, 0, 9742, 0, 10321, 0, 10935, 0
DW 11585, 0, 12274, 0, 13004, 0, 13777, 0, 14596, 0, 15464, 0
DW 16384, 0, 17358, 0, 18390, 0, 19484, 0, 20643, 0, 21870, 0
DW 23170, 0, 24548, 0, 26008, 0, 27554, 0, 29193, 0, 30929, 0
DW 32768, 0, 34716, 0, 36781, 0, 38968, 0, 41285, 0, 43740, 0
DW 46341, 0, 49097, 0, 52016, 0, 55109, 0, 58386, 0, 61858, 0
DW 0, 1, 3897, 1, 8026, 1, 12400, 1, 17034, 1, 21944, 1
DW 27146, 1, 32657, 1, 38496, 1, 44682, 1, 51236, 1, 58179, 1
DW 0, 2, 7794, 2, 16051, 2, 24800, 2, 34068, 2, 43888, 2
DW 54292, 2, 65314, 2, 11456, 3, 23828, 3, 36936, 3, 50823, 3
DW 0, 4, 15588, 4, 32103, 4, 49600, 4, 2601, 5, 22240, 5
DW 43048, 5, 65092, 5, 22912, 6, 47656, 6, 8336, 7, 36110, 7
DW 0, 8, 31176, 8, 64205, 8, 33663, 9, 5201, 10, 44481, 10
DW 20559, 11, 64648, 11, 45823, 12, 29776, 13, 16671, 14, 6684, 15
DW 0, 16, 62352, 16, 62875, 17, 1790, 19, 10403, 20, 23425, 21
DW 41118, 22, 63761, 23, 26111, 25, 59552, 26, 33342, 28, 13368, 30
Tabla de Deslizamiento Lineal Hacia Arriba Leve
Los valores son de 16.16 bit
DW 0, 1, 59, 1, 118, 1, 178, 1, 237, 1 ; 0->4
DW 296, 1, 356, 1, 415, 1, 475, 1, 535, 1 ; 5->9
DW 594, 1, 654, 1, 714, 1, 773, 1, 833, 1 ; 10->14
DW 893, 1 ; 15
Tabla de Deslizamiento Lineal Hacia Arriba
Valor = 2^(Val/192), Los valores son de 16.16
bit
DW 0, 1, 237, 1, 475, 1, 714, 1, 953, 1 ; 0->4
DW 1194, 1, 1435, 1, 1677, 1, 1920, 1, 2164, 1 ; 5->9
DW 2409, 1, 2655, 1, 2902, 1, 3149, 1, 3397, 1 ; 10->14
DW 3647, 1, 3897, 1, 4148, 1, 4400, 1, 4653, 1 ; 15->19
DW 4907, 1, 5157, 1, 5417, 1, 5674, 1, 5932, 1 ; 20->24
DW 6190, 1, 6449, 1, 6710, 1, 6971, 1, 7233, 1 ; 25->29
DW 7496, 1, 7761, 1, 8026, 1, 8292, 1, 8559, 1 ; 30->34
DW 8027, 1, 9096, 1, 9366, 1, 9636, 1, 9908, 1 ; 35->39
DW 10181, 1, 10455, 1, 10730, 1, 11006, 1, 11283,1 ; 40->44
DW 11560, 1, 11839, 1, 12119, 1, 12400, 1, 12682,1 ; 45->49
DW 12965, 1, 13249, 1, 13533, 1, 13819, 1, 14106,1 ; 50->54
DW 14394, 1, 14684, 1, 14974, 1, 15265, 1, 15557,1 ; 55->59
DW 15850, 1, 16145, 1, 16440, 1, 16737, 1, 17034,1 ; 60->64
DW 17333, 1, 17633, 1, 17933, 1, 18235, 1, 18538,1 ; 65->69
DW 18842, 1, 19147, 1, 19454, 1, 19761, 1, 20070,1 ; 70->74
DW 20379, 1, 20690, 1, 21002, 1, 21315, 1, 21629,1 ; 75->79
DW 21944, 1, 22260, 1, 22578, 1, 22897, 1, 23216,1 ; 80->84
DW 23537, 1, 23860, 1, 24183, 1, 24507, 1, 24833,1 ; 85->89
DW 25160, 1, 25488, 1, 25817, 1, 26148, 1, 26479,1 ; 90->94
DW 26812, 1, 27146, 1, 27481, 1, 27818, 1, 28155,1 ; 95->99
DW 28494, 1, 28834, 1, 29175, 1, 29518, 1, 29862,1 ; 100->104
DW 30207, 1, 30553, 1, 30900, 1, 31248, 1, 31599,1 ; 105->109
DW 31951, 1, 32303, 1, 32657, 1, 33012, 1, 33369,1 ; 110->114
DW 33726, 1, 34085, 1, 34446, 1, 34807, 1, 35170,1 ; 115->119
DW 35534, 1, 35900, 1, 36267, 1, 36635, 1, 37004,1 ; 120->124
DW 37375, 1, 37747, 1, 38121, 1, 38496, 1, 38872,1 ; 125->129
DW 39250, 1, 39629, 1, 40009, 1, 40391, 1, 40774,1 ; 130->134
DW 41158, 1, 41544, 1, 41932, 1, 42320, 1, 42710,1 ; 135->139
DW 43102, 1, 43495, 1, 43889, 1, 44285, 1, 44682,1 ; 140->144
DW 45081, 1, 45481, 1, 45882, 1, 46285, 1, 46690,1 ; 145->149
DW 47095, 1, 47503, 1, 47917, 1, 48322, 1, 48734,1 ; 150->154
DW 49147, 1, 49562, 1, 49978, 1, 50396, 1, 50815,1 ; 155->159
DW 51236, 1, 51658, 1, 52082, 1, 52507, 1, 52934,1 ; 160->164
DW 53363, 1, 53793, 1, 54224, 1, 54658, 1, 55092,1 ; 165->169
DW 55529, 1, 55966, 1, 56406, 1, 56847, 1, 57289,1 ; 170->174
DW 57734, 1, 58179, 1, 58627, 1, 59076, 1, 59527,1 ; 175->179
DW 59979, 1, 60433, 1, 60889, 1, 61346, 1, 61805,1 ; 180->184
DW 62265, 1, 62727, 1, 63191, 1, 63657, 1, 64124,1 ; 185->189
DW 64593, 1, 65064, 1, 0, 2, 474, 2, 950, 2 ; 190->194
DW 1427, 2, 1906, 2, 2387, 2, 2870, 2, 3355, 2 ; 195->199
DW 3841, 2, 4327, 2, 4818, 2, 5310, 2, 5803, 2 ; 200->204
DW 6298, 2, 6795, 2, 7294, 2, 7794, 2, 8296, 2 ; 205->209
DW 8800, 2, 9306, 2, 9814, 2, 10323, 2, 10835,2 ; 210->214
DW 11348, 2, 11863, 2, 12380, 2, 12899, 2, 13419,2 ; 215->219
DW 13942, 2, 14467, 2, 14993, 2, 15521, 2, 16051,2 ; 220->224
DW 16583, 2, 17117, 2, 17653, 2, 18191, 2, 18731,2 ; 225->229
DW 19273, 2, 19817, 2, 20362, 2, 20910, 2, 21460,2 ; 230->234
DW 22011, 2, 22565, 2, 23121, 2, 23678, 2, 24238,2 ; 235->239
DW 24800, 2, 25363, 2, 25929, 2, 25497, 2, 27067,2 ; 240->244
DW 27639, 2, 28213, 2, 28789, 2, 29367, 2, 29947,2 ; 245->249
DW 30530, 2, 31114, 2, 31701, 2, 32289, 2, 32880, 2 ; 250->254
DW 33473, 2, 34068, 2 ; 255->256
Tabla de Deslizamiento Lineal Hacia Abajo Leve
Los Valores son de 0.16 bit
DW 65535, 65477, 65418, 65359, 65300, 65241,
65182, 65359 ; 0->7
DW 65065, 65006, 64947, 64888, 64830, 64772, 64713, 64645 ; 8->15
Tabla de Deslizamiento Lineal Hacia Abajo Los
Valores son de 0.16 bit
DW 65535, 65300, 65065, 64830, 64596, 64364,
64132, 63901 ; 0->7
DW 63670, 63441, 63212, 62984, 62757, 62531, 62306, 62081 ; 8->15
DW 61858, 61635, 61413, 61191, 60971, 60751, 60532, 60314 ; 16->23
DW 60097, 59880, 59664, 59449, 59235, 59022, 58809, 58597 ; 24->31
DW 58386, 58176, 57966, 57757, 57549, 57341, 57135, 56929 ; 32->39
DW 56724, 56519, 56316, 56113, 55911, 55709, 55508, 55308 ; 40->47
DW 55109, 54910, 54713, 54515, 54319, 54123, 53928, 53734 ; 48->55
DW 53540, 53347, 53155, 52963, 52773, 52582, 52393, 52204 ; 56->63
DW 52016, 51829, 51642, 51456, 51270, 51085, 50901, 50718 ; 64->71
DW 50535, 50353, 50172, 49991, 49811, 49631, 49452, 49274 ; 72->79
DW 49097, 48920, 48743, 48568, 48393, 48128, 48044, 47871 ; 80->87
DW 47699, 47527, 47356, 47185, 47015, 46846, 46677, 46509 ; 88->95
DW 46341, 46174, 46008, 45842, 45677, 45512, 45348, 45185 ; 96->103
DW 45022, 44859, 44698, 44537, 44376, 44216, 44057, 43898 ;104->111
DW 43740, 43582, 43425, 43269, 43113, 42958, 42803, 42649 ;112->119
DW 42495, 42342, 42189, 42037, 41886, 41735, 41584, 41434 ;120->127
DW 41285, 41136, 40988, 10840, 40639, 40566, 40400, 40253 ;128->135
DW 40110, 39965, 39821, 39678, 39535, 39392, 39250, 39109 ;136->143
DW 38968, 38828, 38688, 38548, 38409, 38271, 38133, 37996 ;144->151
DW 37859, 37722, 37586, 37451, 37316, 37181, 37047, 36914 ;152->159
DW 36781, 36648, 36516, 36385, 36254, 36123, 35993, 35863 ;160->167
DW 35734, 35605, 35477, 35349, 35221, 35095, 34968, 34842 ;168->175
DW 34716, 34591, 34467, 34343, 34219, 34095, 33973, 33850 ;176->183
DW 33728, 33607, 33486, 33365, 33245, 33125, 33005, 32887 ;184->191
DW 32768, 32650, 32532, 32415, 32298, 32182, 32066, 31950 ;192->199
DW 31835, 31720, 31606, 31492, 31379, 31266, 31153, 31041 ;200->207
DW 30929, 30817, 30706, 30596, 30485, 30376, 30226, 30157 ;208->215
DW 30048, 29940, 29832, 29725, 29618, 29511, 29405, 29299 ;216->223
DW 29193, 29088, 28983, 28879, 28774, 28671, 28567, 28464 ;224->231
DW 28362, 28260, 28158, 28056, 27955, 27855, 27754, 27654 ;232->239
DW 27554, 27455, 27356, 27258, 27159, 27062, 26964, 26867 ;240->247
DW 26770, 26674, 26577, 26482, 26386, 26291, 26196, 26102 ;248->255
DW 26008 ; 256
5.9.- Información de los efectos
Aquí está toda la información que se me puede ocurrir para los efectos. Las variables "Proceso" son variables utilizadas internamente por los efectos para controlar la dirección de la reproducción...
Esta sección no ha sido completada todavía.
Primero, éste es el diagrama de flujo para procesar la información, no está detallado totalmente, pero sí lo están los pasos más importantes.
+---------------------------------------------------------+
¦ Poner el volumen de la nota al volumen de cada canal ¦
¦ Poner la frecuencia de la nota a la frecuencia del canal¦
+---------------------------------------------------------+
¦
+-------------------------+
¦ Decr. contador de ticks ¦ Sí
¦ Está a 0 ? +-------------------------+
+-------------------------+ ¦
¦ ¦
No ¦ +----------------------------------------+
+-------------------------+ ¦ Contador Tick = Contador Tick
inic. ¦
¦ Actualizar efectos para ¦ ¦ (la actual 'velocidad')
¦
¦ cada canal. ¦ ¦ Decr. contador filas ¦
¦ ¦ ¦ Contador filas a 0? ¦
+-------------------------+
+----------------------------------------+
¦ No ¦ ¦
¦ +---------------------+ ¦ Sí
¦ ¦ ¦
¦ +----------------------------+
+--------------------------------+
¦ ¦ Llamar a iniciarEfectos ¦ ¦ Contador Filas =
1 ¦
¦ ¦ para cada canal. ¦ ¦ ¦
¦ +----------------------------+ ¦ Incr. FilaProceso ¦
¦ ¦ ¦ Es FilaProceso > NºFilas? ¦
+-----------------+ +--------------------------------+
¦ Sí ¦ ¦ No
¦ +-----------------------------------------------+ ¦
¦ ¦ FilaProceso = FilaCorte ¦ ¦
¦ ¦ FilaCorte = 0 ¦ ¦
¦ ¦ Incr. OrdenProceso ¦ ¦
¦ ¦ while Orden[OrdenProceso] = 0xFEh, ¦ ¦
¦ ¦ incr. OrdenProceso ¦ ¦
¦ ¦ if Orden[OrdenProceso] = 0xFFh, ¦ ¦
¦ ¦ OrdenProceso = 0 ¦ ¦
¦ ¦ PatronActual = Orden[OrdenProceso] ¦ ¦
¦ +-----------------------------------------------+ ¦
¦ ¦ ¦
¦ +-----------------------------+
¦ ¦
¦ +------------------------------------------------+
¦ ¦ FilaActual = FilaProceso ¦
¦ ¦ Actualizar Datos Patrón (incluye saltar a la ¦
¦ ¦ fila apropiada si es requerido, y tomar el ¦
¦ ¦ Nº de Filas del patrón) ¦
¦ +------------------------------------------------+
¦ ¦
+-------------------------------+
¦
+-------------------+ Sí +-------------------------------+
¦ Modo Instrumento? +------------------¦ Actualizar
Envolventes ¦
+-------------------+ ¦ Actualizar fadeout (Todo ello¦
¦ ¦ Calcular vol. final si es ¦
¦ No (Modo Sample) ¦ Calcular pan. final requerido¦
¦ ¦ Procesar vibrato de sample )¦
+-------------------------------------++-------------------------------+
¦ Calcular volumen final (Todo ello¦ ¦
¦ Calcular panning final si es ¦ ¦
¦ Procesar vibrato de sample requerido¦ ¦
+-------------------------------------+ ¦
¦ ¦
¦ ¦
+--------------------------------------------------+
¦
+-----------------------------------+
¦ Sonido final!!! ¦
+-----------------------------------+
Axx Poner Tempo
if (xx != 0) {
TickMax = xx;
TickActual = xx;
}
Bxx Saltar al orden
OrdenProceso = xx - 1;
FilaProceso = 0xFFFE;
// Internamente indica otro patrón en el IT...
Cxx Ir a la fila
FilaCorte = xx;
FilaProceso = 0xFFFE;
Dxx Deslizamiento del
volumen
if (xx == 0) then
xx = el último xx para (Dxx/Kxx/Lxx) para este canal.
Orden de chequeo: Dx0, D0x, DxF, DFx
Dx0 Actualizar el efecto
para el canal si este está activo.
Si x = F, sube el volumen en 15 también (para compatibilidad
S3M).
En cada actualización, añade x al volumen, chequea y
ajusta los valores mayores que 64 a 64.
D0x Actualizar el efecto
para el canal si este está activo.
Si x = F, entonces baja el volumen en 15 también (para el
S3M).
En cada actualización, resta x del volumen, chequea y ajusta
los valores menores que 0 a 0.
DxF Añade x al
volumen.
Chequea y ajusta los valores mayores que 64 a 64.
DFx Resta x al volumen.
Chequea y ajusta los valores menores que 0 a 0.
Hxy Vibrato
if (x != 0) {
velocidad = 4*x;
}
if (y != 0) {
profundidad = y * 4;
if(EfectosAntiguos) profundidad <<= 1;
}
Actualiza el efecto sólo si el canal está activo.
Goto IniciarVibrato (explicado después)
Ixy Tremolo, ontime x,
offtime y
if (x != 0) {
ontime = x;
if (EfectosAntiguos) ontime++;
}
if (y != 0) {
offtime = y;
if (EfectosAntiguos) offtime++;
}
Nxx Bajar el volumen del
canal
if (xx == 0) then
xx = último Nxx para este canal.
Orden de chequeo: Nx0, N0x, NxF, NFx
Nx0 Actualizar sólo
si el canal está activo.
En cada actualización, suma x al volumen, chequea y ajusta los
valores mayores que 64 a 64.
N0x
Actualizar sólo si el canal está activo.
En cada actualización, resta x al volumen, chequea u ajusta
los valores menores que 0 a 0.
NxF Añade x al
volumen.
Chequea y ajusta los valores mayores que 64 a 64.
NFx Resta x del volumen.
Chequea y ajusta los valores menores que 0 a 0.
Uxy Vibrato Leve
if (x != 0) {
velocidad = 4*x;
}
if (y != 0) {
profundidad = y;
if(EfectosAntiguos) profundidad <<= 1;
}
Actualizar sólo si el canal está activo.
Goto IniciarVibrato (explicado más tarde)
Wxx Bajar volumen global
if (xx == 0) then
xx = último Wxx para ese canal.
Orden de chequeo: Wx0, W0x, WxF, WFx
Wx0 Actualizar sólo
si el canal está activo.
En cada actualización, sumar x al volumen, chequear y ajustar
los valores mayores que 128 a 128.
W0x Actualizar sólo
si el canal está activo.
En cada actualización, restar x del volumen, chequear y
ajustar los valores menores que 0 a 0.
WxF Sumar x al volumen.
Chequear y ajustar valores mayores que 128 a 128.
WFx Restar x al volumen.
Chequear y ajustar valores menores que 0 a 0.